// JavaScript Document
/**
 * 将JSON格式转换为具有层次结构的Table。
 * 
 * @param value
 * @returns
 */
function ztlJsonToTable(value, n) {
	if (!value && value !== false && value != 0) {
		return "null";
	}
	n = n || 0;
	var a = [];
	var type = typeof value;
	if (type != "object") {
		a.push(value);
	} else {
		if (value.constructor == Date) {
			a.push(value);
		} else if (value.constructor == Array) {
			a.push("<table style='background:" + ztl_color[n] + "'><tbody><tr>");
			for ( var i = 0; i < value.length; i++) {
				a.push("<td>");
				a.push(ztlJsonToTable(value[i], n + 1));
				a.push("</td>");
			}
			a.push("</tr></tbody></table>");
		} else {
			a.push("<table style='background:" + ztl_color[n] + "'><tbody>");
			for ( var key in value) {
				a.push("<tr><td>");
				a.push(key);
				a.push("</td><td>");
				a.push(ztlJsonToTable(value[key], n + 1));
				a.push("</td></tr>");
			}
			a.push("</tbody></table>");
		}
	}
	return a.join("");
}

/**
 * 将JSON格式转换为具有层次结构的Table。并且限制最大的递归层数。 存在这个函数的意义在于有一些对象它的子属性又指向其自身，如果
 * 递归的话就会无限循环，看不到任何结果。运用该函数就可以有效的 避免这个问题，通过指定一个最大的递归层数，到达这个层数就会退 出该递归。
 * 
 * @param value
 * @returns
 */
function ztlJsonToLimitTable(value, limit, n) {
	if (!value && value !== false && value != 0) {
		return "null";
	}
	n = n || 0;
	var a = [];
	var type = typeof value;
	if (type != "object") {
		a.push(value);
	} else {
		if (value.constructor == Date) {
			a.push(value);
		} else if (value.constructor == Array) {
			if (n >= limit) {
				return "[......]";
			}
			a.push("<table style='background:" + ztl_color[n] + "'><tbody><tr>");
			for ( var i = 0; i < value.length; i++) {
				a.push("<td>");
				a.push(ztlJsonToLimitTable(value[i], limit, n + 1));
				a.push("</td>");
			}
			a.push("</tr></tbody></table>");
		} else {
			if (n >= limit) {
				return "{......}";
			}
			a.push("<table style='background:" + ztl_color[n] + "'><tbody>");
			for ( var key in value) {
				if (JSON == value[key])
					continue;
				a.push("<tr><td>");
				a.push(key);
				a.push("</td><td>");
				a.push(ztlJsonToLimitTable(value[key], limit, n + 1));
				a.push("</td></tr>");
			}
			a.push("</tbody></table>");
		}
	}
	return a.join("");
}

/**
 * 在id为_test_的DOM中向后添加(append)value，如果没有定义id为_test_
 * 的DOM，则该函数会自动添加id为_test_的div。如果value是JSON格式，会 将它转换为String或Table。
 * 
 * @param value
 *            需要解析的JSON数据或者对象 limit 默认值为0，没有最大的限制层数。如果有值的话表示最大限 制的递归层数。 type
 *            默认值为0，表示将value解析成Table，如果值为1的话表示 将value解析成string。 notMove
 *            默认情况下为false移动，如果为true，则不移动。
 */
function ztlPrint(value, limit, type, notMove) {
	limit = limit || 0;
	type = type || 0;

	var str = "";
	if (type == 0) {
		if (limit === 0) {
			str = ztlJsonToTable(value);
		} else {
			str = ztlJsonToLimitTable(value, limit);
		}
	} else if (type == 1) {
		str = ztlJsonToString(value);
	}

	if ($("#_test_")[0]) {
		$("#_test_").append(str);
	} else {
		var sb = new StringBuilder();
		sb += "<div id='_test_' style='position:absolute;top:0px;left:0px'>";
		sb += str;
		sb += "</div>";
		$("body").append(sb.toString());
	}
	if (!notMove) { // 不传递move值的时候或者传递值为假的时候默认可以移动。
		ztlMoveTable();
	}
}

/**
 * 给id为_test_的DOM添加事件。 在该DOM上单击鼠标，然后拖动可以进入移动该DOM状态，再将单击取消移动状态。
 */
function ztlMoveTable() {
	if (!$("#_test_")[0]) { // 如果不存在id为_test_的控件，直接返回。
		return;
	}
	var _x_ = 0, _y_ = 0, pre_x_ = 0, pre_y_ = 0;
	var move = false;
	$("#_test_").css({
		postion : "absolute",
		left : "0px",
		top : "0px"
	}).click(function(e) {
		_x_ = e.pageX;
		_y_ = e.pageY;
		pre_x_ = parseInt($(this).css("left"));
		pre_y_ = parseInt($(this).css("top"));
		move = !move;
	}).mousemove(function(e) {
		if (move) {
			$(this).css({
				left : (pre_x_ + e.pageX - _x_) + "px",
				top : (pre_y_ + e.pageY - _y_) + "px"
			});
		}
	});
}